#include "Server/include/File.h"

int _File::_fopen(const char* path){
    file=fopen(path,"r");
    if(!file){
        printf("%s:%s\n",path,strerror(errno));
        return -1;
    }
    return 0;
}
void _File::_fclose(){
    fclose(file);
    file=nullptr;
}

int _File::_read_all(const char* path){
    /**
     * 读取全部文件
     * path : 读取文件路径，内容存储在 _File 的 text 中
     * return : 读取成功返回0，失败返回-1
     * 
    */
    struct stat statbuf;
    if(stat(path,&statbuf)<0){
        printf("%s\n",strerror(errno));
        return -1;
    }
    size=statbuf.st_size;
    text=new(std::nothrow) char[size+1];
    if(text==nullptr){
        printf("new err...\n");
        return -1;
    }
    FILE* file=fopen(path,"r");
    fread(text,sizeof(char),size,file);
    fclose(file);
    return 0;
}


int _File::_read_n(const char* path,char* buf,int buf_size,int &label){
    /**
     * 分段读取文件
     * path : file path;
     * buf : 用于读取文件的内存空间，用户提供，将文件数据放进buf中，然后返回给用户
     * buf_size : 数值为内存空间的大小
     * &label : 标记位，初始化指定为0。读取文件后，会将label置为1。文件读取完毕后，label会重新置为0。
     * return : 返回label。文件读取完毕，返回label值=0。异常，返回 -1；
    */
    switch (label)
    {
    case 0:
        label=1;
        if(file==nullptr){
            if(_fopen(path)<0){
                return -1;
            }
        }
        case 1:;
        if(feof(file)){  // 文件读取完毕，将label置为0，关闭文件。返回label
            label=0;
            _fclose();
            return label;
        }
        memset(buf,0,buf_size);
        int l=fread(buf,sizeof(char),buf_size,file);
        if(l<buf_size){
            if(!feof(file)){
                printf("%s\n",strerror(errno));
                _fclose();
                return -1;
            }
            return label;
        }
        return label;
    }
    return -1;
}

// int _File::_read_n(char* buf,int buf_size){
//     if(file==nullptr) return 0;
//     int l=fread(buf,sizeof(char),buf_size,file);
//     if(l<buf_size){
//         if(feof(file)){
//             //读取完毕
//             _fclose();
//         }  
//         else{
//             return -1;
//         }
//     }
//     return l;
// }
